package com.zhihuishu.micro.course.service;

import java.util.List;
import java.util.Set;

import com.zhihuishu.micro.course.dto.ChapterDto;
import com.zhihuishu.micro.course.model.Chapter;

/**
 * 
 * @author zhanglikun
 * @date 2015年10月28日 下午2:13:03
 */
public interface ChapterService extends IBaseService<Chapter> {

    Integer create(ChapterDto chapter, long creator);

    

    ChapterDto get(Integer chapterId);

    /**
     * 查询课程对应章列表，课程ID使用CourseDto主键(区别于原来表结构设计)
     * 
     * @param courseId
     * @return
     */
    List<ChapterDto> list(long courseId);

    /**
     * 查询章ID列表(未删除且已发布)
     * 
     * @param courseId
     * @return
     */
    List<Integer> listChapterId(long courseId);

    /**
     * 章节学习天数(课程下所有章计划学习天数)
     * 
     * @param courseId
     * @return
     */
    int chapterStudyDays(long courseId);

    /**
     * 更新章缓存哈希
     * 
     * @param chapterId
     * @return 从数据库中获取的章信息
     */
    ChapterDto touchChapter(int chapterId);
    /**
     * @Description:更新缓存hash
     *  @date:@2017年1月9日下午2:51:02
     *  @author:嵇鹏
     *  @Param:
     *  @retuen:void
     */
    void touchChapter(ChapterDto chapterDto);

    /**
     * 向课程添加章缓存(关系)
     * 
     * @param courseId
     * @param chapterId
     */
    void addChapterOnCourseRedis(long courseId, int chapterId);

    /**
     * 从课程中移除章缓存(关系)
     * 
     * @param courseId
     * @param chapterId
     */
    void removeChapterOnCourseRedis(long courseId, int chapterId);

    /**
     * 根据课程id(cc_course主键ID)查询章信息（完整度信息）
     * 
     * @param courseId
     * @return
     */
    List<ChapterDto> findChaptersByCourseId(Long courseId);

    /**
     * 
     * @discription 查询通过审核的章数量(即章测试的数量)
     * @author jipeng
     * @created 2016年9月19日 上午11:20:55
     * @param courseId
     */
    int queryPassChapterCountByCourseId(long courseId);

    /**
     * 根据课程ID查询章节
     * 
     * @author ztl
     * @param courseId
     * @return
     */
    List<ChapterDto> getChapterListFromDb(Long courseId);

    /**
     * @Description: 添加到缓存中
     * @date:@2016年12月6日下午5:02:58
     * @author:嵇鹏
     * @Param:
     * @retuen:void
     */
    void addChapterOnCourseRedisWithOutChecPassStatus(long courseId, int chapterId);

    /**
     * @Description:从课程-全部章节关系缓存中移除章id
     * @date:@2016年12月6日下午5:15:05
     * @author:嵇鹏
     * @Param:
     * @retuen:void
     */
    void removeChapterOnCourseRedisWithOutChecPassStatus(long courseId, int chapterId);
    /**
     * @Description:为app保存章
     *  @date:@2016年12月7日下午5:01:33
     *  @author:嵇鹏
     *  @Param:
     *  @retuen:void
     */
    void saveChapterForApp(ChapterDto chapterDto);
    /**
     * @Description:根据课程与顺序查询后面的章ids
     *  @date:@2016年12月8日下午1:58:08
     *  @author:嵇鹏
     *  @Param:
     *  @retuen:List<Integer>
     */
    List<Integer> queryIdsByCourseIdAndOredrNunber(Long courseId, Integer orderNumber);
    /**
     * @Description:更新顺序
     *  @date:@2016年12月8日下午2:20:52
     *  @author:嵇鹏
     *  @Param:
     *  @retuen:void
     */
    void updateMinusOrderNumByCourseIdAndOrderNumber(Long courseId, Integer orderNumber);
    /**
     * @Description:查询需要更改顺序的章ids
     *  @date:@2016年12月8日下午4:08:58
     *  @author:嵇鹏
     *  @Param:
     *  @retuen:List<Integer>
     */
    List<Integer> queryChapterIdsContainSmallOrder(Long courseId, Integer orginRank, Integer targerRank);
    /**
     * @Description:查询需要更改顺序的章ids
     *  @date:@2016年12月8日下午4:09:22
     *  @author:嵇鹏
     *  @Param:
     *  @retuen:List<Integer>
     */
    List<Integer> queryChapterIdsContainBigOrder(Long courseId, Integer orginRank, Integer targerRank);
    /**
     * @Description:删除章
     *  @date:@2016年12月16日下午1:35:02
     *  @author:嵇鹏
     * @param courseId 
     *  @Param:
     *  @retuen:void
     */
    void deleteChapterById(Chapter chapter, Long courseId);


    /**
     * @Description:更新章或者课程的步骤完成状态
     *  @date:@2016年12月16日下午4:00:47
     *  @author:嵇鹏
     * @param userId 
     * @return 
     *  @Param:
     *  @retuen:void
     */
    void updateChapterPassStatusAndStepStatus(Integer chapterId, Long courseId, long userId);
    /**
     * @Description:根据课程id查询所有通过的章ids
     *  @date:@2017年1月11日下午5:27:30
     *  @author:嵇鹏
     *  @Param:
     *  @retuen:List<Integer>
     */
    Set<String> queryPassChapterIdsByCourseIdAndAddToCache(long courseId);
    /**
     * @Description:查询课程下所有的ids
     *  @date:@2017年1月11日下午7:00:55
     *  @author:嵇鹏
     *  @Param:
     *  @retuen:List<Integer>
     */
    Set<String> queryChapterIdsByCourseIdAndAddToCache(Long courseId);
    
        
    
    
    
  

}
